package com.itheima.exception;

import org.springframework.stereotype.Component;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

/**
 * @program: spring_base
 * @description:
 * @author: zhanghz001
 * @create: 2020-12-03 16:30
 **/
@Component
//使用注解开发异常处理器
//声明该类是一个Controller的通知类，声明后该类就会被加载成异常处理器
@ControllerAdvice
public class ProjectExceptionAdvice {
    // @ResponseBody
    //异常处理
    // 器类中针对指定异常进行处理的方法上方  作用：设置指定异常的处理方式  范例：  说明：处
    // 理器方法可以设定多个

    //类中定义的方法携带@ExceptionHandler注解的会被作为异常处理器，后面添加实际处理的异常类型
    @ExceptionHandler({IndexOutOfBoundsException.class})
    public String doOtherException1(Exception ex, Model model) {
        model.addAttribute("msg", ex.getMessage());
        return "error.jsp";
    }

    @ExceptionHandler({NullPointerException.class})
    public String doOtherException(Exception ex, Model model) {
        model.addAttribute("msg", ex.getMessage());
        return "error.jsp";
    }

    @ExceptionHandler({BusinessException.class})
    // @ResponseBody
    public String doOtherException4(Exception ex, Model model) {
        //使用参数Model将要保存的数据传递到页面上，功能等同于ModelAndView
        //业务异常出现的消息要发送给用户查看
        model.addAttribute("msg", ex.getMessage());
        return "error.jsp";
    }

    @ExceptionHandler({SystemException.class})
    // @ResponseBody
    public String doOtherException5(Exception ex, Model model) {
        //实际的问题现象应该传递给redis服务器，运维人员通过后台系统查看
        //实际的问题显现更应该传递给redis服务器，运维人员通过后台系统查看
        model.addAttribute("msg", ex.getMessage());
        return "error.jsp";
    }

    @ExceptionHandler({Exception.class})
    // @ResponseBody
    public String doOtherException3(Exception ex, Model model) {
        model.addAttribute("msg", ex.getMessage());
        //将ex对象保存起来
        return "error.jsp";
    }

}
